package algorithm.dp;

public class 二维区域和检索矩阵不可变 {
/*
 * 给定一个二维矩阵，计算其子矩形范围内元素的总和，该子矩阵的左上角为 (row1, col1) ，右下角为 (row2, col2)。


上图子矩阵左上角 (row1, col1) = (2, 1) ，右下角(row2, col2) = (4, 3)，该子矩形内元素的总和为 8。

示例:

给定 matrix = [
  [3, 0, 1, 4, 2],
  [5, 6, 3, 2, 1],
  [1, 2, 0, 1, 5],
  [4, 1, 0, 1, 7],
  [1, 0, 3, 0, 5]
]

sumRegion(2, 1, 4, 3) -> 8
sumRegion(1, 1, 2, 2) -> 11
sumRegion(1, 2, 2, 4) -> 12
说明:

你可以假设矩阵不可变。
会多次调用 sumRegion 方法。
你可以假设 row1 ≤ row2 且 col1 ≤ col2。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/range-sum-query-2d-immutable
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
    int[][] map =null;

    public 二维区域和检索矩阵不可变(int[][] matrix) {
        int row = matrix.length;
        int col = matrix[0].length;
        map = new int[row + 5][col + 5];
        for (int i = 1; i <= row; i++) {
            for (int j = 1; j <= col; j++) {
                map[i][j] = map[i - 1][j] + map[i][j - 1] - map[i - 1][j - 1] + matrix[i - 1][j - 1];
            }
        }
    }

    public int sumRegion(int row1, int col1, int row2, int col2) {
        /*
         * area= (row2,col2)-(row1,col2)-(row2,col1)+(row1,col1) 执行用时 : 131 ms ,
         * 在所有Java提交中击败了 57.51% 的用户 内存消耗 : 46.2 MB , 在所有Java提交中击败了 90.38% 的用户
         */
        row2++;
        col2++;
        return map[row2][col2] - map[row1][col2] - map[row2][col1] + map[row1][col1];
    }

    public static void main(String[] args) {
        int[][] matrix = { { 3, 0, 1, 4, 2 }, { 5, 6, 3, 2, 1 }, { 1, 2, 0, 1, 5 }, { 4, 1, 0, 1, 7 },
                { 1, 0, 3, 0, 5 } };
        二维区域和检索矩阵不可变 run = new 二维区域和检索矩阵不可变(matrix);
        System.out.println(run.sumRegion(1, 1, 2, 2));
        System.out.println(run.sumRegion(1, 2, 2, 4));
    }
}
